package leetcode_121_140;

public class isPalindrome_125 {
    /**
     *如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后
     * 短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。
     *
     * 字母和数字都属于字母数字字符。
     */
    public boolean isPalindrome(String s) {
        /**
         * 想法就是双指针双向判断,实时跳过非字母数字字符
         * A~Z  65~90
         * a~z   97~122
         * 0~9  48~57
         * 2ms
         */
        int l=0,r=s.length()-1;
        if(s.length()==1)
            return true;
        while(l<=r){
            //去除非字母数字字符影响
            while(l<r && !(s.charAt(l)<=122&&s.charAt(l)>=97 || s.charAt(l)<=57&&s.charAt(l)>=48 || s.charAt(l)<=90&&s.charAt(l)>=65))
                l++;
            while(r>l && !(s.charAt(r)<=122&&s.charAt(r)>=97 || s.charAt(r)<=57&&s.charAt(r)>=48 || s.charAt(r)<=90&&s.charAt(r)>=65))
                r--;

            if(l>s.length()-1 || r<0)  //出现越界，说明
                return false;

            int a=s.charAt(l)>=97?s.charAt(l)-' '-32:s.charAt(l)-' ';
            int b=s.charAt(r)>=97?s.charAt(r)-' '-32:s.charAt(r)-' ';

            if(a!=b)
                return false;

            l++;
            r--;
        }
        return true;
    }
}
